package com.ruoyi.pack.service;

import java.util.List;
import com.ruoyi.pack.domain.PackContainer;
import com.ruoyi.pack.domain.dto.PackContainerInventoryDTO;
import com.ruoyi.pack.domain.dto.PackContainerSummaryDto;
import com.ruoyi.pack.domain.dto.PackMaterialSummaryDto;

/**
 * 器具Service接口
 * 
 * @author ruoyi
 * @date 2024-01-01
 */
public interface IPackContainerService 
{
    /**
     * 查询器具
     * 
     * @param containerId 器具主键
     * @return 器具
     */
    public PackContainer selectPackContainerByContainerId(Long containerId);

    /**
     * 查询器具列表
     * 
     * @param packContainer 器具
     * @return 器具集合
     */
    public List<PackContainer> selectPackContainerList(PackContainer packContainer);

    /**
     * 新增器具
     * 
     * @param packContainer 器具
     * @return 结果
     */
    public int insertPackContainer(PackContainer packContainer);

    /**
     * 修改器具
     * 
     * @param packContainer 器具
     * @return 结果
     */
    public int updatePackContainer(PackContainer packContainer);

    /**
     * 批量删除器具
     * 
     * @param containerIds 需要删除的器具主键集合
     * @return 结果
     */
    public int deletePackContainerByContainerIds(Long[] containerIds);

    /**
     * 删除器具信息
     * 
     * @param containerId 器具主键
     * @return 结果
     */
    public int deletePackContainerByContainerId(Long containerId);

    /**
     * 根据器具编码查询器具
     * 
     * @param containerCode 器具编码
     * @return 器具
     */
    public PackContainer selectPackContainerByContainerCode(String containerCode);

    /**
     * 器具绑定定位器
     * 
     * @param containerId 器具ID
     * @param locatorId 定位器ID
     * @return 结果
     */
    public int bindLocator(Long containerId, Long locatorId);

    /**
     * 器具解绑定位器
     * 
     * @param containerId 器具ID
     * @return 结果
     */
    public int unbindLocator(Long containerId);

    /**
     * 器具批量绑定定位器
     * 
     * @param containerId 器具ID
     * @param locatorIds 定位器ID列表
     * @return 结果
     */
    public int batchBindLocators(Long containerId, Long[] locatorIds);

    /**
     * 更新器具状态
     * 
     * @param containerId 器具ID
     * @param locationStatus 位置状态
     * @param businessStatus 业务状态
     * @param packingStatus 装箱状态
     * @return 结果
     */
    public int updateContainerStatus(Long containerId, String locationStatus, String businessStatus, String packingStatus);

    /**
     * 器具装箱
     * 
     * @param containerId 器具ID
     * @param projectId 项目ID
     * @param materialCode 物料编码
     * @param materialName 物料名称
     * @param materialQuantity 物料数量
     * @param liningScheme 内衬方案
     * @return 结果
     */
    public int packContainer(Long containerId, Long projectId, String materialCode, String materialName, String materialQuantity, String liningScheme);

    /**
     * 器具拆箱
     * 
     * @param containerId 器具ID
     * @return 结果
     */
    public int unpackContainer(Long containerId);

    /**
     * 更新器具定位信息
     * 
     * @param containerId 器具ID
     * @param latitude 纬度
     * @param longitude 经度
     * @param uploadTime 上传时间
     * @param locationLogId 定位日志ID
     * @param address 地址
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @return 结果
     */
    public int updateContainerLocationInfo(Long containerId, String latitude, String longitude, String uploadTime, Long locationLogId, String address, String province, String city, String district);

    /**
     * 库存统计查询
     * 
     * @param packContainer 查询条件
     * @return 库存统计结果
     */
    public List<PackContainerInventoryDTO> selectInventoryStatistics(PackContainer packContainer);

    /**
     * 校验器具编码唯一性
     * 
     * @param containerCode 器具编码
     * @return 结果 true-唯一 false-不唯一
     */
    public boolean checkContainerCodeUnique(String containerCode);

    /**
     * 校验器具是否可以绑定定位器
     * 
     * @param containerId 器具ID
     * @param locatorId 定位器ID
     * @return 结果 true-可以绑定 false-不可以绑定
     */
    public boolean checkCanBindLocator(Long containerId, Long locatorId);

    /**
     * 校验器具状态是否可操作
     *
     * @param containerId 器具ID
     * @param operationType 操作类型
     * @return 结果 true-可操作 false-不可操作
     */
    public boolean checkContainerOperationAllowed(Long containerId, String operationType);

    /**
     * 器具汇总统计查询
     * 按器具型号、库房、项目、状态分组统计器具数量
     *
     * @param packContainer 查询条件
     * @return 汇总统计结果
     */
    public List<PackContainerSummaryDto> selectContainerSummary(PackContainer packContainer);

    /**
     * 获取器具汇总详情列表
     * 根据汇总条件查询具体的器具列表
     *
     * @param packContainer 查询条件
     * @return 器具列表
     */
    public List<PackContainer> selectContainerSummaryDetail(PackContainer packContainer);

    /**
     * 物料汇总统计查询
     * 按物料编码、库房、项目、状态分组统计物料数量
     *
     * @param packContainer 查询条件
     * @return 物料汇总统计结果
     */
    public List<PackMaterialSummaryDto> selectMaterialSummary(PackContainer packContainer);

    /**
     * 获取物料汇总详情列表
     * 根据物料汇总条件查询具体的器具列表
     *
     * @param packContainer 查询条件
     * @return 器具列表
     */
    public List<PackContainer> selectMaterialSummaryDetail(PackContainer packContainer);
}